# SingleColumnReader.java

    package org.codefilarete.stalactite.sql.result;

    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.function.Function;

    import org.codefilarete.stalactite.sql.statement.binder.ResultSetReader;
    import org.codefilarete.tool.function.SerializableThrowingBiFunction;

    /**
     * Reader of a particular column (by its name) from a {@link java.sql.ResultSet}
     *
     * @author Guillaume Mary
     */
    public class SingleColumnReader<C> implements ColumnReader<C> {

    	private final String columnName;

    	private final ResultSetReader<C> reader;

    	public SingleColumnReader(String columnName, SerializableThrowingBiFunction<ResultSet, String, C, SQLException> resultSetGetter) {
    		this(columnName, ResultSetReader.ofMethodReference(resultSetGetter));
    	}

    	public SingleColumnReader(String columnName, ResultSetReader<C> reader) {
    		this.columnName = columnName;
    		this.reader = reader;
    	}

    	public String getColumnName() {
    		return columnName;
    	}

    	public ResultSetReader<C> getReader() {
    		return reader;
    	}

    	@Override
    	public C read(ResultSet resultSet) {
    		return reader.get(resultSet, columnName);
    	}

    	@Override
    	public SingleColumnReader<C> copyWithAliases(Function<String, String> columnMapping) {
    		return new SingleColumnReader<>(columnMapping.apply(columnName), reader);
    	}
    }